#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

vector<vector<int>> threeSum(vector<int>& nums) {
    sort(nums.begin(), nums.end());

    vector<vector<int>> vv;

    int index = 0;
    int n = nums.size();

    while (index < n)
    {
        if (nums[index] > 0) break;

        int left = index + 1, right = n - 1;
        int key = -nums[index];
        while (left < right)
        {
            if (nums[left] + nums[right] > key)
            {
                right--;
            }
            if (nums[left] + nums[right] < key)
            {
                left++;
            }
            else
            {
                vv.push_back({ nums[index] , nums[left] , nums[right] });
                left++;
                right--;
                while (left < right && nums[left] == nums[left - 1])   left++;
                while (left < right && nums[right] == nums[right + 1])   right--;
            }
        }

        index++;
        while (index < n && nums[index] == nums[index - 1])    index++;
    }
    return vv;
}

//vector<vector<int>> threeSum(vector<int>& nums) {
//    sort(nums.begin(), nums.end());
//    vector<vector<int>> vv;
//    set<vector<int>> s;
//    int index = 0;
//    while (index < nums.size())
//    {
//        int left = index + 1, right = nums.size() - 1;
//        int key = -nums[index];
//        while (left < right)
//        {
//            if (nums[left] + nums[right] > key)
//            {
//                right--;
//            }
//            else if (nums[left] + nums[right] < key)
//            {
//                left++;
//            }
//            else
//            {
//                s.insert({ nums[index],nums[left] , nums[right] });
//                left++;
//                right--;
//            }
//        }
//        index++;
//    }
//    for (auto v : s)
//    {
//        vv.push_back(v);
//    }
//    return vv;
//
//}

int main()
{
    vector<int> v = { 1,0,1};
    threeSum(v);
	return 0;
}